package estrutura;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 *
 * @authors cdvdt, Fabio
 */
import java.util.LinkedList;

/**
 * Classe que representa um semestre, respeitando a disponibilidade da matéria e
 * o limite de créditos do semestre
 *
 * @author cdvdt
 */
public class Grade {

    /**
     * Armazena as matérias que compõem o semestre
     */
    private LinkedList<Materias> materias;
    /**
     * armazena o limite de créditos semestral
     */
    private int limiteSemestral;
    /**
     * contem a contagem atual de créditos do semestre
     */
    private int contagemCreditos = 0;

    /**
     * Cria um objeto da classe {@code Grade} com um dado limite de créditos
     * semestral
     *
     * @param limiteSemestral limite de créditos semestral
     */
    public Grade(int limiteSemestral) {
        materias = new LinkedList<>();
        this.limiteSemestral = limiteSemestral;
    }

    /**
     * Adiciona uma matéria ao semestre caso sua adição respeite o limite de
     * créditos semestral
     *
     * @param materia matéria a ser adicionada ao semestre
     * @return true caso a matéria tenha sido adicionada com sucesso, false caso
     * não seja possível adicioná-la
     */
    public boolean addMateria(Materias materia) {
        if (contagemCreditos + materia.getCreditos() <= limiteSemestral) {
            materias.add(materia);
            contagemCreditos += materia.getCreditos();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Remove uma matéria do semestre
     *
     * @param materia
     * @return true caso a remoção seja bem-sucedida, false caso contrário
     */
    public boolean removeMateria(Materias materia) {
        boolean remove = materias.remove(materia);
        if (remove == true) {
            contagemCreditos -= materia.getCreditos();
        }
        return remove;
    }

    /**
     * Retorna as matérias que compõem o semestre
     *
     * @return matérias que compõem o semestre
     */
    public LinkedList<Materias> getMaterias() {
        return materias;
    }

    /**
     * Retorna o limite de créditos semestral para o semestre
     *
     * @return limite de créditos semestral
     */
    public int getLimiteSemestral() {
        return limiteSemestral;
    }

    /**
     * Define o limite de créditos semestral para o semestre
     *
     * @param limiteSemestral limite de créditos semestral para o semestre
     */
    public void setLimiteSemestral(int limiteSemestral) {
        this.limiteSemestral = limiteSemestral;
    }

    /**
     * Retorna a quantidade de créditos acumulada atual do semestre
     *
     * @return quantidade de créditos acumulada atual do semestre
     */
    public int contagemCreditos() {
        return contagemCreditos;
    }
}
